/*
 * ProtocoloControl.cpp
 *
 *  Created on: 23/10/2011
 *      Author: pablo
 */

#include "ProtocoloControl.h"

ProtocoloControl::ProtocoloControl(Socket& sock): socket(sock) {
}

ProtocoloControl::~ProtocoloControl() {
}

void ProtocoloControl::enviarOperacionDetenerServidor() {
	char codigoDetener = CODIGO_DETENER_SERVIDOR;
    enviarCaracter(codigoDetener);
}

void ProtocoloControl::recibirRespuestaDetenido(bool *detenidoConExito) {
	char codigoRecibido = recibirCaracter();
    if(codigoRecibido == CODIGO_DETENIDO_OK)
		*detenidoConExito = true;
	else
		*detenidoConExito = false;
}

void ProtocoloControl::enviarRespuestaDetenido(bool conExito) {
	char codigoDetenidoConExito = 0;
	if(conExito)
		codigoDetenidoConExito = CODIGO_DETENIDO_OK;
	else
		codigoDetenidoConExito = CODIGO_DETENIDO_ERROR;
	enviarCaracter(codigoDetenidoConExito);
}

void ProtocoloControl::recibirOperacionDetener(bool *hayQueDetener) {
	char respuestaRecibida = 0;
	respuestaRecibida = recibirCaracter();
	if(respuestaRecibida == CODIGO_DETENER_SERVIDOR)
		*hayQueDetener = true;
	else
		*hayQueDetener = false;
}

char ProtocoloControl::recibirCaracter() {
    char codigoRecibido = 0;
    int recibidos = 0;
    while(recibidos < (int)(sizeof (codigoRecibido))){
        int recibidoIt = this->socket.recv(&codigoRecibido, sizeof (codigoRecibido) - recibidos);
        if(recibidoIt < 0){
            throw ProtocoloControlException();
        }
        recibidos += recibidoIt;
    }
    return codigoRecibido;
}

void ProtocoloControl::enviarCaracter(char codigoDetener) {
    int enviados = 0;
    while(enviados < (int)(sizeof (codigoDetener))){
        int enviadoIt = this->socket.send(&codigoDetener + enviados, sizeof (codigoDetener) - enviados);
        if(enviadoIt < 0){
            throw ProtocoloControlException();
        }
        enviados += enviadoIt;
    }
}
